package Persistencia;

import Model.*;
import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;



public class AdministradorPersistenciaReserva {
	
private static AdministradorPersistenciaReserva instancia;
	
	
	private AdministradorPersistenciaReserva()
	{
		
	}
	public static AdministradorPersistenciaReserva getInstancia()
	{
		if (instancia== null)
			instancia =new AdministradorPersistenciaReserva();
		return instancia;
	}
	
	
	public int insert(Reserva r)
	{ 
		int newId=0;
		Connection con = PoolConexiones.getPoolConexiones().getConnection();

		try
		{
			String senten = "INSERT INTO Reservas (fechaInicio ,fechaFin ,estado ,id_tipo , dni, id_auto) VALUES (?,?,?,?,?,?)" ;
			PreparedStatement ps = null;
			ps = con.prepareStatement(senten, Statement.RETURN_GENERATED_KEYS);
			ps.setDate(1, new Date(r.getFechainicio().getTime()));
			ps.setDate(2, new Date(r.getFechafin().getTime()));
			ps.setString(3, r.getEstado());
			ps.setString(4,r.getTipo().getId_tipo());
			ps.setInt(5,r.getCliente().getDni());
			ps.setString(6,r.getAutomovil().getPatente());			
			ps.execute();
			ResultSet  generatedKeys = ps.getGeneratedKeys();
			if(generatedKeys.next())
			{	
				newId = generatedKeys.getInt(1);
			}
			PoolConexiones.getPoolConexiones().realeaseConnection(con);
			return newId;
		}
	      catch( SQLException e ) 
	      {
	    	  PoolConexiones.getPoolConexiones().realeaseConnection(con);
				System.out.println("Error al Insertar Reserva: " + e.getMessage());
				e.printStackTrace();
				return newId;
	      }
	      
	}
	public void update(Reserva r)
	{ 
		Connection con = PoolConexiones.getPoolConexiones().getConnection();
		
		try
		{
			String senten = "UPDATE Reservas set fechaInicio = ? ,fechaFin = ? ,estado = ?, id_tipo = ?, dni = ? where id = ?" ;
			PreparedStatement ps = null;
			ps = con.prepareStatement(senten);
			ps.setDate(1, new Date(r.getFechainicio().getTime()));
			ps.setDate(2, new Date(r.getFechafin().getTime()));
			ps.setString(3, r.getEstado());
			ps.setString(4,r.getTipo().getId_tipo());
			ps.setInt(5,r.getCliente().getDni());
			ps.setInt(6,r.getId());
			ps.execute();
			
			PoolConexiones.getPoolConexiones().realeaseConnection(con);
			
		}
	      catch( SQLException e ) 
	      {
	    	  PoolConexiones.getPoolConexiones().realeaseConnection(con);
	    	  System.out.println("Error al Modificar Reserva: " + e.getMessage());
	    	  e.printStackTrace();				
	      }
	      
		
	}

	public Reserva getReserva(int id)
	{
		Reserva r = null; 
		Connection con = PoolConexiones.getPoolConexiones().getConnection();
		
		try
		{
			String senten = "SELECT fechaInicio ,fechaFin ,estado ,id_tipo , dni, id_auto from reservas where id = ?" ;
			PreparedStatement ps = null;
			ps = con.prepareStatement(senten);
			ps.setInt(1,id);
			ResultSet result = ps.executeQuery();
			while (result.next())
			{
				r = new Reserva(id
						, result.getDate("fechainicio")
						, result.getDate("fechafin")
						, AdministradorPersistenciaTipo.getInstancia().getTipo(result.getString("id_tipo"))
						, AdministradorPersistenciaCliente.getInstancia().getCliente(result.getInt("dni"))
						, result.getString("estado"));
				
				if (result.getString("id_auto").length()>0)
				{
					r.setAutomovil(AdministradorPersistenciaAutomovil.getInstancia().getAuto(result.getString("id_auto")));
				}				
			}
			
			PoolConexiones.getPoolConexiones().realeaseConnection(con);
			return r;
		}
	      catch( SQLException e ) 
	      {
	    	  PoolConexiones.getPoolConexiones().realeaseConnection(con);
				System.out.println("Error al consultar Reserva: " + e.getMessage());
				e.printStackTrace();
	      }
	      return r;
	}
	public ArrayList<Reserva> getReservas()
	{
		Reserva r = null;
		ArrayList<Reserva> listaReservas = new ArrayList<Reserva>();
		Connection con = PoolConexiones.getPoolConexiones().getConnection();
		
		try
		{
			String senten = "SELECT id, fechaInicio ,fechaFin ,estado ,id_tipo , dni, id_auto from reservas" ;
			PreparedStatement ps = null;
			ps = con.prepareStatement(senten);
			ResultSet result = ps.executeQuery();
			while (result.next())
			{
				r = new Reserva(result.getInt("id")
						, result.getDate("fechainicio")
						, result.getDate("fechafin")
						, AdministradorPersistenciaTipo.getInstancia().getTipo(result.getString("id_tipo"))
						, AdministradorPersistenciaCliente.getInstancia().getCliente(result.getInt("dni"))
						, result.getString("estado"));
				
				if (result.getString("id_auto").length()>0)
				{
					r.setAutomovil(AdministradorPersistenciaAutomovil.getInstancia().getAuto(result.getString("id_auto")));
				}		
				
				listaReservas.add(r);
			}
			
			PoolConexiones.getPoolConexiones().realeaseConnection(con);
			return listaReservas;
		}
	      catch( SQLException e ) 
	      {
	    	  PoolConexiones.getPoolConexiones().realeaseConnection(con);
				System.out.println("Error al consultar Reservas: " + e.getMessage());
				e.printStackTrace();
	      }
	      return listaReservas;
	}
	public Boolean autoDisponible(String id_auto, java.util.Date fechaInicio, java.util.Date fechaFin)
	{
		int counter = 0; 
		Connection con = PoolConexiones.getPoolConexiones().getConnection();
		
		try
		{			
			String senten = "SELECT id_auto from reservas where estado='Activa' and id_auto = ? and ((fechaInicio >= ? or fechaInicio <= ?) or (fechaFin >= ? or fechaFin <= ?))" ;
			PreparedStatement ps = null;
			ps = con.prepareStatement(senten);				
			ps.setString(1,id_auto);
			ps.setDate(2, new Date(fechaInicio.getTime()));
			ps.setDate(3, new Date(fechaInicio.getTime()));
			ps.setDate(4, new Date(fechaFin.getTime()));
			ps.setDate(5, new Date(fechaFin.getTime()));
			ResultSet result = ps.executeQuery();			
			while (result.next())
			{
				if (result.getString("id_auto").length()>0)
				{
					counter++;
				}
			}
			
			PoolConexiones.getPoolConexiones().realeaseConnection(con);
			return (counter==0);
		}
	      catch( SQLException e ) 
	      {
	    	  PoolConexiones.getPoolConexiones().realeaseConnection(con);
				System.out.println("Error al consultar disponibilidad: " + e.getMessage());
				e.printStackTrace();
	      }
	      return false;
	}
	
}
